package com.bbva.general.controller;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.quartz.CronTrigger;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;

import com.bbva.general.dao.AdminCargaDAO;
import com.bbva.general.dao.ArchivoCargaDAO;
import com.bbva.general.entities.ArchivoCarga;
import com.bbva.general.util.Constantes;

public class ConfiguracionCargaController
{

	private ArchivoCarga beanArchivoCarga;
	private AdminCargaDAO adminCargaDAO;
	private ArchivoCargaDAO archivoCargaDAO;
	public Object codigoArchivo;
	public boolean estadoBotonGrabar;
	private Scheduler monitor;
	private List<SelectItem> listaArchivoCombo;
	private List<Map<String, Object>> listaArchivos;

	public void setEstadoBotonGrabar(boolean estadoBotonGrabar)
	{
		this.estadoBotonGrabar = estadoBotonGrabar;
	}

	public boolean isEstadoBotonGrabar()
	{
		return estadoBotonGrabar;
	}

	public void init(ActionEvent evt)
	{
		setListaArchivos(archivoCargaDAO.ListarArchivos());
		setEstadoBotonGrabar(true);
	}

	public String init()
	{
		init(null);
		return "configuracion";
	}

	public void cargaArchivo(ActionEvent evt)
	{
		setBeanArchivoCarga(archivoCargaDAO.obtener(Integer.parseInt(this.codigoArchivo.toString())));
		setEstadoBotonGrabar(false);
	}

	@SuppressWarnings("unused")
	private List<SelectItem> cargaComboArchivo()
	{
		List<SelectItem> temp = new ArrayList<SelectItem>();
		List<Map<String, Object>> listado = adminCargaDAO.ListarArchivoCarga();
		temp.add(new SelectItem(Constantes.COMBO_VALUE_STRING, Constantes.COMBO_ITEM_TODOS));
		for (Map<String, Object> dato : listado)
		{
			temp.add(new SelectItem(dato.get("IDARCHIVO").toString(), (String) dato.get("DESCRIPCION_ARCHIVO")));
		}
		return temp;
	}

	public void actualizarConfiguracion(ActionEvent evt) throws SchedulerException, ParseException
	{
		try
		{
			if (!this.getBeanArchivoCarga().getRutaArchivo().endsWith(Constantes.SEPARADOR))
			{
				this.getBeanArchivoCarga().setRutaArchivo(this.getBeanArchivoCarga().getRutaArchivo() + Constantes.SEPARADOR);
			}
			getBeanArchivoCarga().setIdArchivo(this.codigoArchivo.toString());
			archivoCargaDAO.Actualizar(this.getBeanArchivoCarga());
			setListaArchivos(archivoCargaDAO.ListarArchivos());

			String strCron = "10 " + this.getBeanArchivoCarga().getMinutoEjecucion() + " "
					+ this.getBeanArchivoCarga().getHoraEjecucion() + " " + this.getBeanArchivoCarga().getDiaMesEjecucion() + " "
					+ this.getBeanArchivoCarga().getMesEjecucion() + " " + this.getBeanArchivoCarga().getDiaSemanaEjecucion();

			int idArchivo = Integer.parseInt(this.codigoArchivo.toString());
			CronTrigger testCronTrigger = null;
			String strNombreTrigger = "";
			switch (idArchivo)
			{
				case Constantes.IDARCHIVO_FORMATO50:
					strNombreTrigger = Constantes.NOMBRE_TRIGGER_FORMATO50;
					testCronTrigger = (CronTrigger) monitor.getTrigger(strNombreTrigger, "DEFAULT");
					testCronTrigger.setCronExpression(strCron);
					break;
				case Constantes.IDARCHIVO_FORMATO51:
					strNombreTrigger = Constantes.NOMBRE_TRIGGER_FORMATO51;
					testCronTrigger = (CronTrigger) monitor.getTrigger(strNombreTrigger, "DEFAULT");
					testCronTrigger.setCronExpression(strCron);
					break;
				case Constantes.IDARCHIVO_FERIADOS:
					strNombreTrigger = Constantes.NOMBRE_TRIGGER_FERIADO;
					testCronTrigger = (CronTrigger) monitor.getTrigger(strNombreTrigger, "DEFAULT");
					testCronTrigger.setCronExpression(strCron);
					break;
				case Constantes.IDARCHIVO_UBIGEO:
					strNombreTrigger = Constantes.NOMBRE_TRIGGER_UBIGEO;
					testCronTrigger = (CronTrigger) monitor.getTrigger(strNombreTrigger, "DEFAULT");
					testCronTrigger.setCronExpression(strCron);
					break;
				case Constantes.IDARCHIVO_PRODUCTO:
					strNombreTrigger = Constantes.NOMBRE_TRIGGER_PRODUCTO;
					testCronTrigger = (CronTrigger) monitor.getTrigger(strNombreTrigger, "DEFAULT");
					testCronTrigger.setCronExpression(strCron);
					break;
				case Constantes.IDARCHIVO_TERRITORIO:
					strNombreTrigger = Constantes.NOMBRE_TRIGGER_TERRITORIO;
					testCronTrigger = (CronTrigger) monitor.getTrigger(strNombreTrigger, "DEFAULT");
					testCronTrigger.setCronExpression(strCron);
					break;
				case Constantes.IDARCHIVO_FORMATO80:
					strNombreTrigger = Constantes.NOMBRE_TRIGGER_FORMATO80;
					testCronTrigger = (CronTrigger) monitor.getTrigger(strNombreTrigger, "DEFAULT");
					testCronTrigger.setCronExpression(strCron);
					break;
				case Constantes.IDARCHIVO_FORMATO81:
					strNombreTrigger = Constantes.NOMBRE_TRIGGER_FORMATO81;
					testCronTrigger = (CronTrigger) monitor.getTrigger(strNombreTrigger, "DEFAULT");
					testCronTrigger.setCronExpression(strCron);
					break;
				case Constantes.IDARCHIVO_OFIGRU:
					strNombreTrigger = Constantes.NOMBRE_TRIGGER_OFIGRU;
					testCronTrigger = (CronTrigger) monitor.getTrigger(strNombreTrigger, "DEFAULT");
					testCronTrigger.setCronExpression(strCron);
					break;
					
				default:
					break;
			}
			setBeanArchivoCarga(new ArchivoCarga());
			setEstadoBotonGrabar(true);
			if (testCronTrigger != null)
			{
				monitor.rescheduleJob(strNombreTrigger, "DEFAULT", testCronTrigger);
			}
			else
			{

			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	public List<Map<String, Object>> getListaArchivos()
	{
		return listaArchivos;
	}

	public void setListaArchivos(List<Map<String, Object>> listaArchivos)
	{
		this.listaArchivos = listaArchivos;
	}

	public List<SelectItem> getListaArchivoCombo()
	{
		return listaArchivoCombo;
	}

	public void setListaArchivoCombo(List<SelectItem> listaArchivoCombo)
	{
		this.listaArchivoCombo = listaArchivoCombo;
	}

	public Object getCodigoArchivo()
	{
		return codigoArchivo;
	}

	public void setCodigoArchivo(Object codigoArchivo)
	{
		this.codigoArchivo = codigoArchivo;
	}

	public ArchivoCarga getBeanArchivoCarga()
	{
		return beanArchivoCarga;
	}

	public void setBeanArchivoCarga(ArchivoCarga beanArchivoCarga)
	{
		this.beanArchivoCarga = beanArchivoCarga;
	}

	public AdminCargaDAO getAdminCargaDAO()
	{
		return adminCargaDAO;
	}

	public void setAdminCargaDAO(AdminCargaDAO adminCargaDAO)
	{
		this.adminCargaDAO = adminCargaDAO;
	}

	public ArchivoCargaDAO getArchivoCargaDAO()
	{
		return archivoCargaDAO;
	}

	public void setArchivoCargaDAO(ArchivoCargaDAO archivoCargaDAO)
	{
		this.archivoCargaDAO = archivoCargaDAO;
	}

	public Scheduler getMonitor()
	{
		return monitor;
	}

	public void setMonitor(Scheduler monitor)
	{
		this.monitor = monitor;
	}
}
